#!/usr/bin/env python
#-*-coding:utf-8-*-
#正则表达式
import re
#使用compile()编译正则表达式
#re.compile(pattern, flags)
#re.compile性能会提高,建议使用
lineRe = re.compile(r"(\d{4}/\d{2}/\d{2}) (\d{2}):\d{2}:\d{2} ip:([\d,\. ]+) message:(.+)")
#定义字符串
line = """2012/08/09 10:00:02 ip:115.235.229.131 message:[{"i":{"v":"3.1.0","id":"pPqT3GWQjl","u":"4916b934804ca2568721e7d2b9d1150e091fb7ab","mid":"appstore","o":"5.1","m":"iPad"},"id":"pPqT3GWQjl","e":[{"n":"^","t":1344477613462}],"s":"4D8108D7-DD44-4E94-9CF5-581A97B95DBC-132-0000001BA049ADAD"},{"i":{"v":"3.1.0","id":"pPqT3GWQjl","u":"4916b934804ca2568721e7d2b9d1150e091fb7ab","mid":"appstore","o":"5.1","m":"iPad"},"id":"pPqT3GWQjl","e":[{"n":"^","t":1341411476637}],"s":"EDBADD73-486E-4C3A-9AAE-395BF854A71B-94-00000000E3B1553D"},{"id":"pPqT3GWQjl","e":[{"n":"$","t":1341411484110}],"s":"EDBADD73-486E-4C3A-9AAE-395BF854A71B-94-00000000E3B1553D"}]"""
#match()函数尝试从字符串的开头开始对模式进行匹配
m = lineRe.match(line)
if m is not None:
    print m.group(1)
    print m.group(2)
    print m.group(3)
    print m.group(4)
else:
    print "不匹配"
#这个方法用于查找字符串中可以匹配成功的子串
lineRe2 = re.compile(r'"e":')
m2 = lineRe2.search(line)
if m2 is not None:
    print m2.group()
else:
    print "不匹配"
#search和match的区别是match是从字符串开头开始匹配字符

#findall 搜索string，以列表形式返回全部能匹配的子串。
p = re.compile(r'\d+')
print p.findall('one1two2three3four4')
#finditer 搜索string，返回一个顺序访问每一个匹配结果（Match对象）的迭代器。
for m in p.finditer('one1two2three3four4'):
    print m.group()
#使用repl替换string中每一个匹配的子串后返回替换后的字符串。 
#当repl是一个字符串时，可以使用\id或\g<id>、\g<name>引用分组，但不能使用编号0。 
#当repl是一个方法时，这个方法应当只接受一个参数（Match对象），并返回一个字符串用于替换（返回的字符串中不能再引用分组）。 
#count用于指定最多替换次数，不指定时全部替换。 
p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'
 
print p.sub(r'\2 \1', s)
 
def func(m):
    return m.group(1).title() + ' ' + m.group(2).title()
 
print p.sub(func, s)
#subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]): 
#返回 (sub(repl, string[, count]), 替换次数)。
p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'
 
print p.subn(r'\2 \1', s)
 
def func(m):
    return m.group(1).title() + ' ' + m.group(2).title()
 
print p.subn(func, s)
